package com.questionnaires.repository;

import com.questionnaires.exception.EmptyListException;
import com.questionnaires.exception.NotExistsException;
import com.questionnaires.model.Category;
import com.questionnaires.model.Questionnaire;
import com.questionnaires.model.User;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author adriana.calina.oros@gmail.com
 */

@Repository(value = "questionnaireRepository")
public class QuestionnaireRepositoryImpl implements QuestionnaireRepository {

    @Autowired
    private SessionFactory sessionFactory;

    /**
     * {@inheritDoc}
     */
    @Transactional
    public long saveOrUpdate(Questionnaire questionnaire) {
        sessionFactory.getCurrentSession().saveOrUpdate(questionnaire);
        return questionnaire.getId();
    }

    /**
     * {@inheritDoc}
     */
    @Transactional
    public void delete(long id) throws NotExistsException {
        Questionnaire questionnaire = findById(id);
        if (questionnaire == null) {
            throw new NotExistsException("Questionnaire with " + id + " not exists");
        }
        sessionFactory.getCurrentSession().delete(questionnaire);
    }

    /**
     * {@inheritDoc}
     */
    @Transactional(propagation = Propagation.SUPPORTS)
    public List<Questionnaire> getAll() {
        return (List<Questionnaire>) sessionFactory.getCurrentSession().createQuery("from Questionnaire").list();
    }

    @Transactional(propagation = Propagation.SUPPORTS)
    public Questionnaire findById(long id) {
        return (Questionnaire) sessionFactory.getCurrentSession().get(Questionnaire.class, id);
    }

    /**
     * {@inheritDoc}
     */
    @Transactional(propagation = Propagation.SUPPORTS)
    public List<Questionnaire> findActiveQuestionnairesByCategory(Category category) throws EmptyListException {
        Query query = sessionFactory.getCurrentSession().createQuery("from Questionnaire questionnaire where " +
                "questionnaire.active=true" +
                " and questionnaire.category.id=:category_id");
        query.setLong("category_id", category.getId());
        if (query.list().isEmpty()) {
            throw new EmptyListException("There are no active questionnaires in category " + category.getName());
        }
        return query.list();
    }

    /**
     * {@inheritDoc}
     */
    @Transactional(propagation = Propagation.SUPPORTS)
    public List<Questionnaire> findByManager(User manager) throws EmptyListException {
        Query query = sessionFactory.getCurrentSession().createQuery("from Questionnaire questionnaire where " +
                "questionnaire.manager.id=:manager_id");
        query.setLong("manager_id", manager.getId());
        if (query.list().isEmpty()) {
            throw new EmptyListException("There are no questionnaires of manager" + manager.getUsername());
        }
        return query.list();
    }



    @Transactional
    public void setInactive(long id) throws NotExistsException {
        Questionnaire questionnaire = findById(id);
        if (questionnaire == null) {
            throw new NotExistsException("Questionnaire with " + id + " not exists");
        }
        /*questionnaire.setActive(false);
        sessionFactory.getCurrentSession().saveOrUpdate(questionnaire);*/

        Query query = sessionFactory.getCurrentSession().createQuery("update Questionnaire questionnaire " +
                "set active=0 where questionnaire.id=:questionnaire_id");
        query.setLong("questionnaire_id", id);
        query.executeUpdate();

    }
}
